<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<link rel="stylesheet" href="../style/journal.css" type="text/css" />
<style type="text/css"><!--
.googleadsense {
	margin: 2px;
	padding: 0px;
//--></style><script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-65008-1";
urchinTracker();
</script><title>given @Examples[1] when Perl6</title>
</head>
<body>
<a href="index.html">Journal</a>(2005) | <a href="../blog/"><b>Blog</b></a>(2006) | <a href="http://www.fayland.org/cgi-bin/random_link.pl">RandomLink</a> | <a href="AboutFayland.html">WhoAmI</a> | <a href="LiveBookmark.html">LiveBookmark</a> | <a href="http://www.fayland.org/">HomePage</a>
<p><&lt;Previous: <a href="Perl6_ES0.html">@Examples[0] is Perl6</a>&nbsp;&nbsp;>>Next: <a href="Perl6_ES2.html">@Perl6 <== @Examples xx 2</a></p>
<h1>given @Examples[1] when Perl6</h1>
<div class='content'>
<p>Category: <a href='Perl6.html'>Perl6</a> &nbsp; Keywords: <b>Perl6 given</b></p>本来写好了的，不小心按了什么快捷键就没了。damn it!

<h3>given 开关语句</h3>
given-when 是种开关语句（经常有人问 Perl 5 中有没有开关语句，没有开关语句但有个 <a href='http://search.cpan.org/perldoc?Switch'>Switch</a> 模块）。它有点类似于其他语言的 switch-case, 但更强大。（匹配可以是正则表达，函数等）。<br />
一个简单的例子：
<pre><code>given $i { # 这里的 $i 可以是表达式也可以是函数等
    when ($_ != 2) { print '$i isnot 2'; }
    when 1 { print '$i is 1'; }
    print 'b';
    when &foo($_) { print '&foo($i) return true'; }
    when m/^^a/ { print '$i is start with a'; }
    default { print 'default output'; }
}</code></pre>
几点说明：
<ol>
<li>when VALUE 其实是 when $_ ~~ VALUE 的缩写
<li>default 必须放在所有 when 之后。因为 default 是在所有 when 不匹配后才执行。当然你也可以没有 default<br />
default 的作用等同于 when ture { ... }
<li>如果匹配了一个 when, 那么 when 下面的语句将不会执行，匹配后直接跳出。所以这里的 when 1 不会被执行（被上一句执行后跳出了）。
<li>given 块的执行顺序与普通块一样，块里允许存在 when 之外的东西（比如这里的 print 'b';）。<br />
当 $i 不为 2 时输出 $i isnot 2 而不执行print 'b'; 当为 2 时，按顺序会执行 prin 'b';
<li>when 总是智能匹配 $_, 不管是不是在 given 中。（它可以在 for, while, CATCH 等中存在，只要有 $_ 就可以使用 when）。代码例子：
<pre>for (qw(1 2 3)) {
    when 1 { say '1'; }
    when 3 { say '3'; }
    default { say 'not 1, not 3'; }
}</pre>
最后的结果为 1(换行)not 1, not 3(换行)3(换行)<br />
pring 与 say 的区别在于 say 会在后面输出 \n
<li>我们可以使用 break 来跳出当前 when 和当前块。注意 break 只能在 when 里面而不是外面。例如：
<pre><code>given $i {
    when 1 {
        print "1";
        break;
        print "11"; # 这句不会被输出，因为 break 跳出了整个循环
    }
    #break; # 出错，break 不能在 when 外面
    default { print "default output"; }
}</code></pre>
当 $i 为 1 时输出 1，而没有 11
<li>continue 用来跳出当前 when 而继续执行下一语句（没有跳出当前块）。例如：
<pre>given $i {
    when 2 {
        print "2";
        continue;
        print '22'; # 这句不会被输出，因为 continue 跳出了这个 when 2
    }
    default { print "default output"; }
}</pre>
当 $i 为 2 时输出 2default output.
<li>在 for 循环中， break 只跳出当前循环而进入下一循环（不是跳出整个 for 循环）。如果你要跳出整个循环，可以使用 last。我们可以用 next 来代替 break, 因为它表达意思更清晰。
<pre><code>for (qw(1 2 3)) {
    when 1 {
        say '1';
        break; # next is better
        say '11'; # 这句不会输出
    }
    when 2 {
        say '2';
        last;
    }
    when 3 {
        say '3';
    }
    default { say 'default output'; }
}</code></pre>
当 $_ 为 1 时输出 1 （没有输出 11）；当为 2 时输出 2 并且执行 last, 所以 when 3 不会被执行。
<li>如果你使用的带名字的 for 循环，那么第一个带名字变量别名于 $_
<pre>my @foo = (1,2,3);
for @foo -> $foo { # 后面的 when 里的 $_ 就别名于 $foo
for @foo -> $foo1, $foo2 { # 后面的 when 里的 $_ 别名于 $foo1
</pre>
</ol>

<h3>eval && try</h3>
在 Perl 5 中 eval 不仅能运行字符串也能运行块，而在 Perl 6 中 eval 只能运行字符串，块的话我们用 try 来运行。而错误变量将不再是 $@, 而统一变为 $!
<pre>my $a = 0;
eval('$a = 1 / $a');
print $! if $!; # Illegal division by zero

try {
    my $x = 1;
    my $x = 0; # $x 不能定义两次
    CATCH {
        say $!;
    }
}</pre>

<h3>Correct me if I'm wrong</h3>
See u next time.</div>
<p><&lt;Previous: <a href="Perl6_ES0.html">@Examples[0] is Perl6</a>&nbsp;&nbsp;>>Next: <a href="Perl6_ES2.html">@Perl6 <== @Examples xx 2</a></p>
<p><strong>Options:</strong> <a href='http://del.icio.us/post?title=given%20@Examples%5B1%5D%20when%20Perl6&url=http://www.fayland.org/journal/Perl6_ES1.html'>+Del.icio.us</a></p>
<strong>Related items</strong>
<ul><li><a href='Perl6_ES14.html'>has $.Examples14 handles 'Perl6';</a> < <span class='digit'>2005-06-02 01:38:59</span> ></li><li><a href='050519.html'>Synopsis localization</a> < <span class='digit'>2005-05-19 11:21:25</span> ></li><li><a href='Perl6_ES0.html'>@Examples[0] is Perl6</a> < <span class='digit'>2005-05-19 20:26:08</span> ></li><li><a href='Perl6_ES2.html'>@Perl6 <== @Examples xx 2</a> < <span class='digit'>2005-05-20 18:53:54</span> ></li><li><a href='Perl6_ES3.html'>my Perl6 @Examples[3]</a> < <span class='digit'>2005-05-21 13:53:16</span> ></li><li><a href='Perl6_ES4.html'>say q:2 '@*Examples.[4] &Perl6()';</a> < <span class='digit'>2005-05-22 12:24:12</span> ></li><li><a href='Perl6_ES5.html'>sub Perl6 (*@Examples[5] is copy)</a> < <span class='digit'>2005-05-22 15:37:26</span> ></li><li><a href='Perl6_ES6.html'>multi sub Examples (6, Perl6) {...}</a> < <span class='digit'>2005-05-23 22:43:33</span> ></li><li><a href='Perl6_ES7.html'>sub infix:<(7)> ($Perl6, @Examples)</a> < <span class='digit'>2005-05-24 02:16:42</span> ></li><li><a href='Perl6_ES8.html'>let @Examples[8] = 'Perl6';</a> < <span class='digit'>2005-05-24 13:05:58</span> ></li><li><a href='Perl6_ES9.html'>Perl6 | Examples & 9 ^ junction</a> < <span class='digit'>2005-05-26 12:35:29</span> ></li><li><a href='Perl6_ES10.html'>%Examples{'IO'} = open('Perl6');</a> < <span class='digit'>2005-05-30 00:24:01</span> ></li><li><a href='Perl6_ES11.html'>class Examples11 is Perl6 { ... }</a> < <span class='digit'>2005-05-30 13:31:31</span> ></li><li><a href='Perl6_ES12.html'>$Perl6 = $class.bless(:Example<12>);</a> < <span class='digit'>2005-05-31 11:38:46</span> ></li><li><a href='Perl6_ES13.html'>role Example13 { # Perl6 }</a> < <span class='digit'>2005-05-31 18:22:03</span> ></li><li><a href='Perl6_ES16.html'>my subtype Examples16 of Perl6 where /^kissu$/</a> < <span class='digit'>2005-06-04 23:59:29</span> ></li><li><a href='Perl6_ES17.html'>my enum Example17 <<:Perl(6) Today>></a> < <span class='digit'>2005-06-05 12:14:08</span> ></li><li><a href='Perl6_ES18.html'>my $queen; rule me {Perl6|Examples18}</a> < <span class='digit'>2005-06-06 12:26:32</span> ></li><li><a href='Perl6_ES19.html'>m:nth(19)/Perl6Examples/</a> < <span class='digit'>2005-06-06 22:02:01</span> ></li><li><a href='Perl6_Rules.html'>用 Perl6::Rules 来写 Formatter</a> < <span class='digit'>2005-09-27 10:02:45</span> ></li></ul>
Created on <span class="digit">2005-05-19 22:05:56</span>, Last modified on <span class="digit">2005-05-24 12:43:32</span><br />
Copyright 2004-2005 All Rights Reserved. Powered by <a href="Eplanet.html">Eplanet</a> && <a href='http://catalyst.perl.org'>Catalyst</a> 5.62.
</body>
</html>